package main

import (
	"fmt"
	"sync"
	"sync/atomic"
	"time"
)

func main() {
	start := time.Now()
	var count int64 = 0
	wg := sync.WaitGroup{}
	num := 1000000 // 定义 100 万个协程执行任务
	wg.Add(num)
	for i := 0; i < num; i++ {
		go func(params int) {
			if mocRequest(params) == params {
				atomic.AddInt64(&count, 1)
				wg.Done()
			}
		}(i)
	}
	wg.Wait()
	// 减去2秒(2000ms)，是因为任务本身耗时2秒，最终剩余时间都是协程从启动到完成消耗的时间
	useMs := time.Now().Sub(start).Milliseconds() - 2000
	fmt.Printf("100万routine从启动到执行结束，所有协程本身总计耗时：%d ms, routine 执行的总次数：%d\n", useMs, count)
}

// 模拟一个类似http请求数据获取结果的函数
func mocRequest(params int) int {
	// 模拟功能代码执行耗时为 2s
	time.Sleep(2 * time.Second)
	return params
}
